package cn.hpu.mobile_bank.exception;



import cn.hpu.mobile_bank.dto.resp.ApiResult;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.MethodArgumentNotValidException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;

@RestControllerAdvice
@Slf4j
public class GlobalExceptionHandler {
    /**
     * 处理MethodArgumentNotValidException异常
     *
     * @param e MethodArgumentNotValidException异常对象
     * @return ApiResult<?> 返回失败的ApiResult对象
     */
    @ExceptionHandler(value = MethodArgumentNotValidException.class)
    public ApiResult<?> handleMethodArgumentNotValidException(MethodArgumentNotValidException e) {
        // 创建一个StringBuilder对象用于拼接错误信息
        StringBuilder errorMsg = new StringBuilder();
        // 遍历所有字段错误
        e.getBindingResult().getFieldErrors().forEach(fieldError -> {
            // 将字段名和默认错误信息拼接到错误信息中
            errorMsg.append(fieldError.getField() + fieldError.getDefaultMessage()).append(",");
        });
        // 获取完整的错误信息
        String message = errorMsg.toString();
        // 返回失败的ApiResult，将最后一个逗号去掉
        return ApiResult.fail(CommonErrorEnum.PARAM_INVALID.getCode(), message.substring(0,message.length() - 1));
    }

    /**
     * 处理系统异常的异常处理器
     * @param e 抛出的异常
     * @return 返回失败的ApiResult对象
     */
    @ExceptionHandler(value = Throwable.class)
    public ApiResult<?> handleException(Throwable e) {
        log.error("system exception! The reason is:{}", e.getMessage(),e);
        return ApiResult.fail(CommonErrorEnum.SYSTEM_ERROR);
    }

    /**
     * 业务异常处理
     * @param e 业务异常
     * @return
     */
    @ExceptionHandler(value = BusinessException.class)
    public ApiResult<?> handleBusinessException(BusinessException e) {
        log.info("Business exception! The reason is:{}", e.getMessage());
        return ApiResult.fail(e.getErrorCode(), e.getErrorMsg());
    }

}
